241. MSSQL紀錄log,使用QUERY_STORE
WHY
線上出了問題,
但沒有作Tracer,所以就只能先追Slow Query看看了。
Note
本來以為只能寫Trigger,當觸發動作時,記錄當下的Query
後來問了一下GPT,才發現原來現在的SQL server有一個查詢存放區,
是專門拿來放SQL指令。
查詢存放區會收集 DML 陳述式,例如
SELECT
、INSERT
、UPDATE
、DELETE
、MERGE
和BULK INSERT
。
但這也不是很新的東西,從SQL 2016就有了。
但從SQL 2022開始,這個設定就會預設打開。
開啟方式
ALTER DATABASE <database_name>
SET QUERY_STORE = ON (OPERATION_MODE = READ_WRITE);
然後,就可以查看看所有執行過的SQL了。
SELECT Txt.query_text_id, Txt.query_sql_text, Pln.plan_id, Qry.*, RtSt.*
FROM sys.query_store_plan AS Pln
INNER JOIN sys.query_store_query AS Qry
ON Pln.query_id = Qry.query_id
INNER JOIN sys.query_store_query_text AS Txt
ON Qry.query_text_id = Txt.query_text_id
INNER JOIN sys.query_store_runtime_stats RtSt
ON Pln.plan_id = RtSt.plan_id;
計劃存放區中可為查詢儲存的不重複計劃數目,受限於 max_plans_per_query 組態選項。
查詢 max_plans_per_query的值及其他參數
select *
from sys.database_query_store_options
雖然說他的最大值預設是200,
但我實際看起來,我的plan_id已經超過200了還在存。
ref.